package jdk6.jaxb;

import java.io.FileReader;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Description: jdk1.6新特性：使用JAXB2来实现对象与XML之间的映射（Java Architecture for XML Binding）
 * JAXB是Java Architecture for XML Binding的缩写，可以将一个Java对象转变成为XML格式，反之亦然。
 * 我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 
 * 原来JAXB是Java EE的一部分，在JDK6中，SUN将其放到了Java SE中，这也是SUN的一贯做法。
 * JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来，JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等，这就极大简化了开发的工作量。
 * 实际上，在Java EE 5.0中，EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
 * 除了JAXB之外，我们还可以通过XMLBeans和Castor等来实现同样的功能
 * 
 * 需要存在默认构造器
 * 不需要get/set方法
 * 
 * 个人认为：很有用，在JavaEE的框架中，尤其是与数据库相关的操作，都是对象与xml之间有个映射的
 * @author Kwum
 * @date 2017年6月16日 下午9:24:20
 * @version 1.0
 */

public class Run {

    public static void main(String[] args) throws JAXBException, IOException {
        
        JAXBContext context = JAXBContext.newInstance(Cat.class);//指定cat对象
        
        //对象装换为xml文件
//        Marshaller m = context.createMarshaller();
//        Cat cat = new Cat("Tony", "Yellow");
//        FileWriter fw = new FileWriter("src/jdk6/jaxb/cat.xml");   
//        m.marshal(cat, fw);
        
        //xml转换成对象
        FileReader fr = new FileReader("src/jdk6/jaxb/cat.xml");
        Unmarshaller um = context.createUnmarshaller();
        Cat cat = (Cat) um.unmarshal(fr);
        System.out.println(cat.toString());
    }

}

@XmlRootElement//表示cat是一个根元素
class Cat{
    
    @XmlAttribute//name将作为cat的一个属性
    String name;
    
    @XmlElement//color将作为cat的子元素
    String color;

    public Cat(String name, String color){
        this.name = name;
        this.color = color;
    }
    
    public Cat(){}

    @Override
    public String toString() {
        return "Cat [name=" + name + ", color=" + color + "]";
    }
}
